#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 4096  // 缓冲区大小，可调整（留有改进空间）

// 功能：复制源文件到目标文件
// 参数：src_path-源文件路径，dest_path-目标文件路径
// 返回值：0-成功，非0-错误码
int copy_file(const char *src_path, const char *dest_path) {
    FILE *src_file = NULL, *dest_file = NULL;
    char buffer[BUFFER_SIZE];
    size_t read_bytes, write_bytes;

    // 1. 打开源文件（只读二进制模式，支持所有文件类型）
    src_file = fopen(src_path, "rb");
    if (src_file == NULL) {
        perror("❌ 打开源文件失败");  // 输出系统错误信息
        return 1;
    }

    // 2. 打开目标文件（写入二进制模式，文件不存在则创建，存在则覆盖）
    dest_file = fopen(dest_path, "wb");
    if (dest_file == NULL) {
        perror("❌ 创建目标文件失败");
        fclose(src_file);  // 关闭已打开的源文件，避免资源泄露
        return 2;
    }

    // 3. 循环读取源文件并写入目标文件（缓冲区方式，支持大文件）
    printf("📤 正在复制文件：%s → %s\n", src_path, dest_path);
    while ((read_bytes = fread(buffer, 1, BUFFER_SIZE, src_file)) > 0) {
        write_bytes = fwrite(buffer, 1, read_bytes, dest_file);
        if (write_bytes != read_bytes) {
            perror("❌ 文件写入失败");
            fclose(src_file);
            fclose(dest_file);
            return 3;
        }
    }

    // 4. 检查读取过程是否出错
    if (ferror(src_file)) {
        perror("❌ 文件读取失败");
        fclose(src_file);
        fclose(dest_file);
        return 4;
    }

    // 5. 关闭文件（释放资源）
    fclose(src_file);
    fclose(dest_file);
    printf("✅ 文件复制成功！\n");
    return 0;
}

int main(int argc, char *argv[]) {
    // 检查命令行参数（需传入 2 个参数：源文件路径、目标文件路径）
    if (argc != 3) {
        fprintf(stderr, "❌ 参数错误！使用格式：./file_copy 源文件路径 目标文件路径\n");
        fprintf(stderr, "示例：./file_copy test.txt test_copy.txt\n");
        return -1;
    }

    // 调用复制函数
    int ret = copy_file(argv[1], argv[2]);
    return ret;
}
